package com.decorate.demo03;

import java.io.FileReader;
import java.io.IOException;

/**
 * 用装饰者模式设计一个类Linux系统的grep命令,用于检索给定的文件是否包含指定的字符.
 *
 * 系统控制类
 *
 * 宏观设计:
 *   首先把程序功能做一个合理划分:
 *   GrepReader:对流的操作封装 (Model),对文件流进行处理的构建
 *   GrepView: 显示输出数据 (View)
 *   Grep: 系统控制中心(Controller)
 *
 * 微观设计:
 *  GrepReader作为模型,处理char流,说明GrepReader属于Reader等级结构,应当继承Reader抽象类或其子类.
 *  此外,还要求GrepReader可以处理来自文件的流,而且输出必须也是一个流,这就是说,GrepReader是一个过滤类,
 *  应当继承自FilterReader抽象类.
 *
 * 摘自<<java与模式>>
 */
public class Grep {
    private static GrepView gv = new GrepView();
    static GrepReader g;

    public static void main(String[] args) {
        if ( args.length <= 1 ) {
            gv.println("Usage: java Grep <substring> <filenames>");
            gv.println("       <substring> 暂不支持正则");
            gv.println("       <filenames> files to be searched in");
            System.exit( 1 );
        }

        String line;
        try {
            gv.println( "\nGrep: 搜索 " + args[0] + " 文件 " + args[1] );
            gv.println( "文件行号\t\t 下面的行里含有所搜索的字符串\n" );
            g = new GrepReader( new FileReader( args[1] ), args[0] );
            for( ; ; )
            {
                line = g.readLine( );
                if (line == null) break;
                gv.println( args[1] + g.lineNum( ) + ":\t" + line );
            }
            g.close( );
        }catch ( IOException e ) {
            gv.println( e.getMessage() );
        }
    }

}
